/**
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.camel.component.kafka.springboot;

import java.util.concurrent.ExecutorService;
import javax.annotation.Generated;
import org.apache.camel.component.kafka.KafkaManualCommitFactory;
import org.apache.camel.spi.HeaderFilterStrategy;
import org.apache.camel.spi.StateRepository;
import org.apache.camel.spring.boot.ComponentConfigurationPropertiesCommon;
import org.apache.camel.util.jsse.SSLContextParameters;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.NestedConfigurationProperty;

/**
 * The kafka component allows messages to be sent to (or consumed from) Apache
 * Kafka brokers.
 * 
 * Generated by camel-package-maven-plugin - do not edit this file!
 */
@Generated("org.apache.camel.maven.packaging.SpringBootAutoConfigurationMojo")
@ConfigurationProperties(prefix = "camel.component.kafka")
public class KafkaComponentConfiguration
        extends
            ComponentConfigurationPropertiesCommon {

    /**
     * Allows to pre-configure the Kafka component with common options that the
     * endpoints will reuse.
     */
    private KafkaConfigurationNestedConfiguration configuration;
    /**
     * URL of the Kafka brokers to use. The format is host1:port1,host2:port2,
     * and the list can be a subset of brokers or a VIP pointing to a subset of
     * brokers. This option is known as bootstrap.servers in the Kafka
     * documentation.
     */
    private String brokers;
    /**
     * To use a shared custom worker pool for continue routing Exchange after
     * kafka server has acknowledge the message that was sent to it from
     * KafkaProducer using asynchronous non-blocking processing. If using this
     * option then you must handle the lifecycle of the thread pool to shut the
     * pool down when no longer needed.
     */
    private ExecutorService workerPool;
    /**
     * Enable usage of global SSL context parameters.
     */
    private Boolean useGlobalSslContextParameters = false;
    /**
     * This options controls what happens when a consumer is processing an
     * exchange and it fails. If the option is false then the consumer continues
     * to the next message and processes it. If the option is true then the
     * consumer breaks out, and will seek back to offset of the message that
     * caused a failure, and then re-attempt to process this message. However
     * this can lead to endless processing of the same message if its bound to
     * fail every time, eg a poison message. Therefore its recommended to deal
     * with that for example by using Camel's error handler.
     */
    private Boolean breakOnFirstError = false;
    /**
     * Whether to allow doing manual commits via KafkaManualCommit. If this
     * option is enabled then an instance of KafkaManualCommit is stored on the
     * Exchange message header, which allows end users to access this API and
     * perform manual offset commits via the Kafka consumer.
     */
    private Boolean allowManualCommit = false;
    /**
     * Factory to use for creating KafkaManualCommit instances. This allows to
     * plugin a custom factory to create custom KafkaManualCommit instances in
     * case special logic is needed when doing manual commits that deviates from
     * the default implementation that comes out of the box.
     */
    @NestedConfigurationProperty
    private KafkaManualCommitFactory kafkaManualCommitFactory;
    /**
     * Whether the component should resolve property placeholders on itself when
     * starting. Only properties which are of String type can use property
     * placeholders.
     */
    private Boolean resolvePropertyPlaceholders = true;

    public KafkaConfigurationNestedConfiguration getConfiguration() {
        return configuration;
    }

    public void setConfiguration(
            KafkaConfigurationNestedConfiguration configuration) {
        this.configuration = configuration;
    }

    public String getBrokers() {
        return brokers;
    }

    public void setBrokers(String brokers) {
        this.brokers = brokers;
    }

    public ExecutorService getWorkerPool() {
        return workerPool;
    }

    public void setWorkerPool(ExecutorService workerPool) {
        this.workerPool = workerPool;
    }

    public Boolean getUseGlobalSslContextParameters() {
        return useGlobalSslContextParameters;
    }

    public void setUseGlobalSslContextParameters(
            Boolean useGlobalSslContextParameters) {
        this.useGlobalSslContextParameters = useGlobalSslContextParameters;
    }

    public Boolean getBreakOnFirstError() {
        return breakOnFirstError;
    }

    public void setBreakOnFirstError(Boolean breakOnFirstError) {
        this.breakOnFirstError = breakOnFirstError;
    }

    public Boolean getAllowManualCommit() {
        return allowManualCommit;
    }

    public void setAllowManualCommit(Boolean allowManualCommit) {
        this.allowManualCommit = allowManualCommit;
    }

    public KafkaManualCommitFactory getKafkaManualCommitFactory() {
        return kafkaManualCommitFactory;
    }

    public void setKafkaManualCommitFactory(
            KafkaManualCommitFactory kafkaManualCommitFactory) {
        this.kafkaManualCommitFactory = kafkaManualCommitFactory;
    }

    public Boolean getResolvePropertyPlaceholders() {
        return resolvePropertyPlaceholders;
    }

    public void setResolvePropertyPlaceholders(
            Boolean resolvePropertyPlaceholders) {
        this.resolvePropertyPlaceholders = resolvePropertyPlaceholders;
    }

    public static class KafkaConfigurationNestedConfiguration {
        public static final Class CAMEL_NESTED_CLASS = org.apache.camel.component.kafka.KafkaConfiguration.class;
        /**
         * Whether the topic is a pattern (regular expression). This can be used
         * to subscribe to dynamic number of topics matching the pattern.
         */
        private Boolean topicIsPattern = false;
        /**
         * A string that uniquely identifies the group of consumer processes to
         * which this consumer belongs. By setting the same group id multiple
         * processes indicate that they are all part of the same consumer group.
         * This option is required for consumers.
         */
        private String groupId;
        /**
         * If the option is true, then KafkaProducer will ignore the
         * KafkaConstants.TOPIC header setting of the inbound message.
         */
        private Boolean bridgeEndpoint = false;
        /**
         * If the option is true, then KafkaProducer will detect if the message
         * is attempted to be sent back to the same topic it may come from, if
         * the message was original from a kafka consumer. If the
         * KafkaConstants.TOPIC header is the same as the original kafka
         * consumer topic, then the header setting is ignored, and the topic of
         * the producer endpoint is used. In other words this avoids sending the
         * same message back to where it came from. This option is not in use if
         * the option bridgeEndpoint is set to true.
         */
        private Boolean circularTopicDetection = true;
        /**
         * The partitioner class for partitioning messages amongst sub-topics.
         * The default partitioner is based on the hash of the key.
         */
        private String partitioner = "org.apache.kafka.clients.producer.internals.DefaultPartitioner";
        /**
         * Name of the topic to use. On the consumer you can use comma to
         * separate multiple topics. A producer can only send a message to a
         * single topic.
         */
        private String topic;
        /**
         * Number of concurrent consumers on the consumer
         */
        private Integer consumerStreams = 10;
        /**
         * The number of consumers that connect to kafka server
         */
        private Integer consumersCount = 1;
        /**
         * The client id is a user-specified string sent in each request to help
         * trace calls. It should logically identify the application making the
         * request.
         */
        private String clientId;
        /**
         * If true, periodically commit to ZooKeeper the offset of messages
         * already fetched by the consumer. This committed offset will be used
         * when the process fails as the position from which the new consumer
         * will begin.
         */
        private Boolean autoCommitEnable = true;
        /**
         * Whether to allow doing manual commits via {@link KafkaManualCommit} .
         * <p/>
         * If this option is enabled then an instance of
         * {@link KafkaManualCommit} is stored on the {@link Exchange} message
         * header, which allows end users to access this API and perform manual
         * offset commits via the Kafka consumer.
         */
        private Boolean allowManualCommit = false;
        /**
         * The offset repository to use in order to locally store the offset of
         * each partition of the topic. Defining one will disable the
         * autocommit.
         */
        private StateRepository offsetRepository;
        /**
         * The frequency in ms that the consumer offsets are committed to
         * zookeeper.
         */
        private Integer autoCommitIntervalMs = 5000;
        /**
         * The minimum amount of data the server should return for a fetch
         * request. If insufficient data is available the request will wait for
         * that much data to accumulate before answering the request.
         */
        private Integer fetchMinBytes = 1;
        private Integer fetchMaxBytes = 52428800;
        /**
         * The maximum amount of time the server will block before answering the
         * fetch request if there isn't sufficient data to immediately satisfy
         * fetch.min.bytes
         */
        private Integer fetchWaitMaxMs = 500;
        /**
         * What to do when there is no initial offset in ZooKeeper or if an
         * offset is out of range: smallest : automatically reset the offset to
         * the smallest offset largest : automatically reset the offset to the
         * largest offset fail: throw exception to the consumer
         */
        private String autoOffsetReset = "latest";
        /**
         * Whether to perform an explicit auto commit when the consumer stops to
         * ensure the broker has a commit from the last consumed message. This
         * requires the option autoCommitEnable is turned on. The possible
         * values are: sync, async, or none. And sync is the default value.
         */
        private String autoCommitOnStop = "sync";
        /**
         * This options controls what happens when a consumer is processing an
         * exchange and it fails. If the option is <tt>false</tt> then the
         * consumer continues to the next message and processes it. If the
         * option is <tt>true</tt> then the consumer breaks out, and will seek
         * back to offset of the message that caused a failure, and then
         * re-attempt to process this message. However this can lead to endless
         * processing of the same message if its bound to fail every time, eg a
         * poison message. Therefore its recommended to deal with that for
         * example by using Camel's error handler.
         */
        private Boolean breakOnFirstError = false;
        /**
         * URL of the Kafka brokers to use. The format is
         * host1:port1,host2:port2, and the list can be a subset of brokers or a
         * VIP pointing to a subset of brokers.
         * <p/>
         * This option is known as <tt>bootstrap.servers</tt> in the Kafka
         * documentation.
         */
        private String brokers;
        /**
         * This parameter allows you to specify the compression codec for all
         * data generated by this producer. Valid values are "none", "gzip" and
         * "snappy".
         */
        private String compressionCodec = "none";
        /**
         * Before each retry, the producer refreshes the metadata of relevant
         * topics to see if a new leader has been elected. Since leader election
         * takes a bit of time, this property specifies the amount of time that
         * the producer waits before refreshing the metadata.
         */
        private Integer retryBackoffMs = 100;
        /**
         * Socket write buffer size
         */
        private Integer sendBufferBytes = 131072;
        /**
         * The amount of time the broker will wait trying to meet the
         * request.required.acks requirement before sending back an error to the
         * client.
         */
        private Integer requestTimeoutMs = 305000;
        /**
         * The maximum number of unsent messages that can be queued up the
         * producer when using async mode before either the producer must be
         * blocked or data must be dropped.
         */
        private Integer queueBufferingMaxMessages = 10000;
        /**
         * The serializer class for messages.
         */
        private String serializerClass = "org.apache.kafka.common.serialization.StringSerializer";
        /**
         * The serializer class for keys (defaults to the same as for messages
         * if nothing is given).
         */
        private String keySerializerClass = "org.apache.kafka.common.serialization.StringSerializer";
        /**
         * Kerberos kinit command path. Default is /usr/bin/kinit
         */
        private String kerberosInitCmd = "/usr/bin/kinit";
        /**
         * Login thread sleep time between refresh attempts.
         */
        private Integer kerberosBeforeReloginMinTime = 60000;
        /**
         * Percentage of random jitter added to the renewal time.
         */
        private Double kerberosRenewJitter;
        /**
         * Login thread will sleep until the specified window factor of time
         * from last refresh to ticket's expiry has been reached, at which time
         * it will try to renew the ticket.
         */
        private Double kerberosRenewWindowFactor;
        /**
         * A list of rules for mapping from principal names to short names
         * (typically operating system usernames). The rules are evaluated in
         * order and the first rule that matches a principal name is used to map
         * it to a short name. Any later rules in the list are ignored. By
         * default, principal names of the form {username}/{hostname}@{REALM}
         * are mapped to {username}. For more details on the format please see
         * <a href=\"#security_authz\"> security authorization and acls</a>.
         * <p/>
         * Multiple values can be separated by comma
         */
        private String kerberosPrincipalToLocalRules = "DEFAULT";
        /**
         * A list of cipher suites. This is a named combination of
         * authentication, encryption, MAC and key exchange algorithm used to
         * negotiate the security settings for a network connection using TLS or
         * SSL network protocol.By default all the available cipher suites are
         * supported.
         */
        private String sslCipherSuites;
        /**
         * The endpoint identification algorithm to validate server hostname
         * using server certificate.
         */
        private String sslEndpointAlgorithm;
        /**
         * The algorithm used by key manager factory for SSL connections.
         * Default value is the key manager factory algorithm configured for the
         * Java Virtual Machine.
         */
        private String sslKeymanagerAlgorithm = "SunX509";
        /**
         * The algorithm used by trust manager factory for SSL connections.
         * Default value is the trust manager factory algorithm configured for
         * the Java Virtual Machine.
         */
        private String sslTrustmanagerAlgorithm = "PKIX";
        /**
         * The list of protocols enabled for SSL connections. TLSv1.2, TLSv1.1
         * and TLSv1 are enabled by default.
         */
        private String sslEnabledProtocols = "TLSv1.2,TLSv1.1,TLSv1";
        /**
         * The file format of the key store file. This is optional for client.
         * Default value is JKS
         */
        private String sslKeystoreType = "JKS";
        /**
         * The SSL protocol used to generate the SSLContext. Default setting is
         * TLS, which is fine for most cases. Allowed values in recent JVMs are
         * TLS, TLSv1.1 and TLSv1.2. SSL, SSLv2 and SSLv3 may be supported in
         * older JVMs, but their usage is discouraged due to known security
         * vulnerabilities.
         */
        private String sslProtocol = "TLS";
        /**
         * The name of the security provider used for SSL connections. Default
         * value is the default security provider of the JVM.
         */
        private String sslProvider;
        /**
         * The file format of the trust store file. Default value is JKS.
         */
        private String sslTruststoreType = "JKS";
        /**
         * The Kerberos principal name that Kafka runs as. This can be defined
         * either in Kafka's JAAS config or in Kafka's config.
         */
        private String saslKerberosServiceName;
        /**
         * The Simple Authentication and Security Layer (SASL) Mechanism used.
         * For the valid values see <a href=
         * "http://www.iana.org/assignments/sasl-mechanisms/sasl-mechanisms.xhtml"
         * >http://www.iana.org/assignments/sasl-mechanisms/sasl-mechanisms.
         * xhtml</a>
         */
        private String saslMechanism = "GSSAPI";
        /**
         * Expose the kafka sasl.jaas.config parameter Example:
         * org.apache.kafka.common.security.plain.PlainLoginModule required
         * username="USERNAME" password="PASSWORD";
         */
        private String saslJaasConfig;
        /**
         * Protocol used to communicate with brokers. Currently only PLAINTEXT
         * and SSL are supported.
         */
        private String securityProtocol = "PLAINTEXT";
        /**
         * SSL configuration using a Camel {@link SSLContextParameters} object.
         * If configured it's applied before the other SSL endpoint parameters.
         */
        @NestedConfigurationProperty
        private SSLContextParameters sslContextParameters;
        /**
         * The password of the private key in the key store file. This is
         * optional for client.
         */
        private String sslKeyPassword;
        /**
         * The location of the key store file. This is optional for client and
         * can be used for two-way authentication for client.
         */
        private String sslKeystoreLocation;
        /**
         * The store password for the key store file.This is optional for client
         * and only needed if ssl.keystore.location is configured.
         */
        private String sslKeystorePassword;
        /**
         * The location of the trust store file.
         */
        private String sslTruststoreLocation;
        /**
         * The password for the trust store file.
         */
        private String sslTruststorePassword;
        /**
         * The total bytes of memory the producer can use to buffer records
         * waiting to be sent to the server. If records are sent faster than
         * they can be delivered to the server the producer will either block or
         * throw an exception based on the preference specified by
         * block.on.buffer.full.This setting should correspond roughly to the
         * total memory the producer will use, but is not a hard bound since not
         * all memory the producer uses is used for buffering. Some additional
         * memory will be used for compression (if compression is enabled) as
         * well as for maintaining in-flight requests.
         */
        private Integer bufferMemorySize = 33554432;
        /**
         * The record key (or null if no key is specified). If this option has
         * been configured then it take precedence over header
         * {@link KafkaConstants#KEY}
         */
        private String key;
        /**
         * The partition to which the record will be sent (or null if no
         * partition was specified). If this option has been configured then it
         * take precedence over header {@link KafkaConstants#PARTITION_KEY}
         */
        private Integer partitionKey;
        /**
         * The number of acknowledgments the producer requires the leader to
         * have received before considering a request complete. This controls
         * the durability of records that are sent. The following settings are
         * common: acks=0 If set to zero then the producer will not wait for any
         * acknowledgment from the server at all. The record will be immediately
         * added to the socket buffer and considered sent. No guarantee can be
         * made that the server has received the record in this case, and the
         * retries configuration will not take effect (as the client won't
         * generally know of any failures). The offset given back for each
         * record will always be set to -1. acks=1 This will mean the leader
         * will write the record to its local log but will respond without
         * awaiting full acknowledgement from all followers. In this case should
         * the leader fail immediately after acknowledging the record but before
         * the followers have replicated it then the record will be lost.
         * acks=all This means the leader will wait for the full set of in-sync
         * replicas to acknowledge the record. This guarantees that the record
         * will not be lost as long as at least one in-sync replica remains
         * alive. This is the strongest available guarantee.
         */
        private String requestRequiredAcks = "1";
        /**
         * Setting a value greater than zero will cause the client to resend any
         * record whose send fails with a potentially transient error. Note that
         * this retry is no different than if the client resent the record upon
         * receiving the error. Allowing retries will potentially change the
         * ordering of records because if two records are sent to a single
         * partition, and the first fails and is retried but the second
         * succeeds, then the second record may appear first.
         */
        private Integer retries = 0;
        /**
         * The producer will attempt to batch records together into fewer
         * requests whenever multiple records are being sent to the same
         * partition. This helps performance on both the client and the server.
         * This configuration controls the default batch size in bytes. No
         * attempt will be made to batch records larger than this size.Requests
         * sent to brokers will contain multiple batches, one for each partition
         * with data available to be sent.A small batch size will make batching
         * less common and may reduce throughput (a batch size of zero will
         * disable batching entirely). A very large batch size may use memory a
         * bit more wastefully as we will always allocate a buffer of the
         * specified batch size in anticipation of additional records.
         */
        private Integer producerBatchSize = 16384;
        /**
         * Close idle connections after the number of milliseconds specified by
         * this config.
         */
        private Integer connectionMaxIdleMs = 540000;
        /**
         * The producer groups together any records that arrive in between
         * request transmissions into a single batched request. Normally this
         * occurs only under load when records arrive faster than they can be
         * sent out. However in some circumstances the client may want to reduce
         * the number of requests even under moderate load. This setting
         * accomplishes this by adding a small amount of artificial delay—that
         * is, rather than immediately sending out a record the producer will
         * wait for up to the given delay to allow other records to be sent so
         * that the sends can be batched together. This can be thought of as
         * analogous to Nagle's algorithm in TCP. This setting gives the upper
         * bound on the delay for batching: once we get batch.size worth of
         * records for a partition it will be sent immediately regardless of
         * this setting, however if we have fewer than this many bytes
         * accumulated for this partition we will 'linger' for the specified
         * time waiting for more records to show up. This setting defaults to 0
         * (i.e. no delay). Setting linger.ms=5, for example, would have the
         * effect of reducing the number of requests sent but would add up to
         * 5ms of latency to records sent in the absense of load.
         */
        private Integer lingerMs = 0;
        /**
         * The configuration controls how long sending to kafka will block.
         * These methods can be blocked for multiple reasons. For e.g: buffer
         * full, metadata unavailable.This configuration imposes maximum limit
         * on the total time spent in fetching metadata, serialization of key
         * and value, partitioning and allocation of buffer memory when doing a
         * send(). In case of partitionsFor(), this configuration imposes a
         * maximum time threshold on waiting for metadata
         */
        private Integer maxBlockMs = 60000;
        /**
         * The maximum size of a request. This is also effectively a cap on the
         * maximum record size. Note that the server has its own cap on record
         * size which may be different from this. This setting will limit the
         * number of record batches the producer will send in a single request
         * to avoid sending huge requests.
         */
        private Integer maxRequestSize = 1048576;
        /**
         * The size of the TCP receive buffer (SO_RCVBUF) to use when reading
         * data.
         */
        private Integer receiveBufferBytes = 65536;
        /**
         * The maximum number of unacknowledged requests the client will send on
         * a single connection before blocking. Note that if this setting is set
         * to be greater than 1 and there are failed sends, there is a risk of
         * message re-ordering due to retries (i.e., if retries are enabled).
         */
        private Integer maxInFlightRequest = 5;
        /**
         * The period of time in milliseconds after which we force a refresh of
         * metadata even if we haven't seen any partition leadership changes to
         * proactively discover any new brokers or partitions.
         */
        private Integer metadataMaxAgeMs = 300000;
        /**
         * A list of classes to use as metrics reporters. Implementing the
         * MetricReporter interface allows plugging in classes that will be
         * notified of new metric creation. The JmxReporter is always included
         * to register JMX statistics.
         */
        private String metricReporters;
        /**
         * The number of samples maintained to compute metrics.
         */
        private Integer noOfMetricsSample = 2;
        /**
         * The number of samples maintained to compute metrics.
         */
        private Integer metricsSampleWindowMs = 30000;
        /**
         * The amount of time to wait before attempting to reconnect to a given
         * host. This avoids repeatedly connecting to a host in a tight loop.
         * This backoff applies to all requests sent by the consumer to the
         * broker.
         */
        private Integer reconnectBackoffMs = 50;
        /**
         * The expected time between heartbeats to the consumer coordinator when
         * using Kafka's group management facilities. Heartbeats are used to
         * ensure that the consumer's session stays active and to facilitate
         * rebalancing when new consumers join or leave the group. The value
         * must be set lower than session.timeout.ms, but typically should be
         * set no higher than 1/3 of that value. It can be adjusted even lower
         * to control the expected time for normal rebalances.
         */
        private Integer heartbeatIntervalMs = 3000;
        /**
         * The maximum amount of data per-partition the server will return. The
         * maximum total memory used for a request will be #partitions *
         * max.partition.fetch.bytes. This size must be at least as large as the
         * maximum message size the server allows or else it is possible for the
         * producer to send messages larger than the consumer can fetch. If that
         * happens, the consumer can get stuck trying to fetch a large message
         * on a certain partition.
         */
        private Integer maxPartitionFetchBytes = 1048576;
        /**
         * The timeout used to detect failures when using Kafka's group
         * management facilities.
         */
        private Integer sessionTimeoutMs = 10000;
        /**
         * The maximum number of records returned in a single call to poll()
         */
        private Integer maxPollRecords = 500;
        /**
         * The timeout used when polling the KafkaConsumer.
         */
        private Long pollTimeoutMs = 5000L;
        /**
         * The maximum delay between invocations of poll() when using consumer
         * group management. This places an upper bound on the amount of time
         * that the consumer can be idle before fetching more records. If poll()
         * is not called before expiration of this timeout, then the consumer is
         * considered failed and the group will rebalance in order to reassign
         * the partitions to another member.
         */
        private Long maxPollIntervalMs;
        /**
         * The class name of the partition assignment strategy that the client
         * will use to distribute partition ownership amongst consumer instances
         * when group management is used
         */
        private String partitionAssignor = "org.apache.kafka.clients.consumer.RangeAssignor";
        /**
         * The configuration controls the maximum amount of time the client will
         * wait for the response of a request. If the response is not received
         * before the timeout elapses the client will resend the request if
         * necessary or fail the request if retries are exhausted.
         */
        private Integer consumerRequestTimeoutMs = 40000;
        /**
         * Automatically check the CRC32 of the records consumed. This ensures
         * no on-the-wire or on-disk corruption to the messages occurred. This
         * check adds some overhead, so it may be disabled in cases seeking
         * extreme performance.
         */
        private Boolean checkCrcs = true;
        /**
         * Deserializer class for key that implements the Deserializer
         * interface.
         */
        private String keyDeserializer = "org.apache.kafka.common.serialization.StringDeserializer";
        /**
         * Deserializer class for value that implements the Deserializer
         * interface.
         */
        private String valueDeserializer = "org.apache.kafka.common.serialization.StringDeserializer";
        /**
         * Set if KafkaConsumer will read from beginning or end on startup:
         * beginning : read from beginning end : read from end This is replacing
         * the earlier property seekToBeginning
         */
        private String seekTo;
        /**
         * To use a custom worker pool for continue routing {@link Exchange}
         * after kafka server has acknowledge the message that was sent to it
         * from {@link KafkaProducer} using asynchronous non-blocking
         * processing.
         */
        private ExecutorService workerPool;
        /**
         * Number of core threads for the worker pool for continue routing
         * {@link Exchange} after kafka server has acknowledge the message that
         * was sent to it from {@link KafkaProducer} using asynchronous
         * non-blocking processing.
         */
        private Integer workerPoolCoreSize = 10;
        /**
         * Maximum number of threads for the worker pool for continue routing
         * {@link Exchange} after kafka server has acknowledge the message that
         * was sent to it from {@link KafkaProducer} using asynchronous
         * non-blocking processing.
         */
        private Integer workerPoolMaxSize = 20;
        /**
         * Whether the producer should store the {@link RecordMetadata} results
         * from sending to Kafka. The results are stored in a {@link List}
         * containing the {@link RecordMetadata} metadata's. The list is stored
         * on a header with the key {@link KafkaConstants#KAFKA_RECORDMETA}
         */
        private Boolean recordMetadata = true;
        /**
         * Sets interceptors for producer or consumers. Producer interceptors
         * have to be classes implementing
         * {@link org.apache.kafka.clients.producer.ProducerInterceptor}
         * Consumer interceptors have to be classes implementing
         * {@link org.apache.kafka.clients.consumer.ConsumerInterceptor} Note
         * that if you use Producer interceptor on a consumer it will throw a
         * class cast exception in runtime
         */
        private String interceptorClasses;
        /**
         * If set to 'true' the producer will ensure that exactly one copy of
         * each message is written in the stream. If 'false', producer retries
         * may write duplicates of the retried message in the stream. If set to
         * true this option will require max.in.flight.requests.per.connection
         * to be set to 1 and retries cannot be zero and additionally acks must
         * be set to 'all'.
         */
        private Boolean enableIdempotence = false;
        /**
         * The maximum amount of time in milliseconds to wait when reconnecting
         * to a broker that has repeatedly failed to connect. If provided, the
         * backoff per host will increase exponentially for each consecutive
         * connection failure, up to this maximum. After calculating the backoff
         * increase, 20% random jitter is added to avoid connection storms.
         */
        private Integer reconnectBackoffMaxMs = 1000;
        /**
         * To use a custom HeaderFilterStrategy to filter header to and from
         * Camel message.
         */
        private HeaderFilterStrategy headerFilterStrategy;

        public Boolean getTopicIsPattern() {
            return topicIsPattern;
        }

        public void setTopicIsPattern(Boolean topicIsPattern) {
            this.topicIsPattern = topicIsPattern;
        }

        public String getGroupId() {
            return groupId;
        }

        public void setGroupId(String groupId) {
            this.groupId = groupId;
        }

        public Boolean getBridgeEndpoint() {
            return bridgeEndpoint;
        }

        public void setBridgeEndpoint(Boolean bridgeEndpoint) {
            this.bridgeEndpoint = bridgeEndpoint;
        }

        public Boolean getCircularTopicDetection() {
            return circularTopicDetection;
        }

        public void setCircularTopicDetection(Boolean circularTopicDetection) {
            this.circularTopicDetection = circularTopicDetection;
        }

        public String getPartitioner() {
            return partitioner;
        }

        public void setPartitioner(String partitioner) {
            this.partitioner = partitioner;
        }

        public String getTopic() {
            return topic;
        }

        public void setTopic(String topic) {
            this.topic = topic;
        }

        public Integer getConsumerStreams() {
            return consumerStreams;
        }

        public void setConsumerStreams(Integer consumerStreams) {
            this.consumerStreams = consumerStreams;
        }

        public Integer getConsumersCount() {
            return consumersCount;
        }

        public void setConsumersCount(Integer consumersCount) {
            this.consumersCount = consumersCount;
        }

        public String getClientId() {
            return clientId;
        }

        public void setClientId(String clientId) {
            this.clientId = clientId;
        }

        public Boolean getAutoCommitEnable() {
            return autoCommitEnable;
        }

        public void setAutoCommitEnable(Boolean autoCommitEnable) {
            this.autoCommitEnable = autoCommitEnable;
        }

        public Boolean getAllowManualCommit() {
            return allowManualCommit;
        }

        public void setAllowManualCommit(Boolean allowManualCommit) {
            this.allowManualCommit = allowManualCommit;
        }

        public StateRepository getOffsetRepository() {
            return offsetRepository;
        }

        public void setOffsetRepository(StateRepository offsetRepository) {
            this.offsetRepository = offsetRepository;
        }

        public Integer getAutoCommitIntervalMs() {
            return autoCommitIntervalMs;
        }

        public void setAutoCommitIntervalMs(Integer autoCommitIntervalMs) {
            this.autoCommitIntervalMs = autoCommitIntervalMs;
        }

        public Integer getFetchMinBytes() {
            return fetchMinBytes;
        }

        public void setFetchMinBytes(Integer fetchMinBytes) {
            this.fetchMinBytes = fetchMinBytes;
        }

        public Integer getFetchMaxBytes() {
            return fetchMaxBytes;
        }

        public void setFetchMaxBytes(Integer fetchMaxBytes) {
            this.fetchMaxBytes = fetchMaxBytes;
        }

        public Integer getFetchWaitMaxMs() {
            return fetchWaitMaxMs;
        }

        public void setFetchWaitMaxMs(Integer fetchWaitMaxMs) {
            this.fetchWaitMaxMs = fetchWaitMaxMs;
        }

        public String getAutoOffsetReset() {
            return autoOffsetReset;
        }

        public void setAutoOffsetReset(String autoOffsetReset) {
            this.autoOffsetReset = autoOffsetReset;
        }

        public String getAutoCommitOnStop() {
            return autoCommitOnStop;
        }

        public void setAutoCommitOnStop(String autoCommitOnStop) {
            this.autoCommitOnStop = autoCommitOnStop;
        }

        public Boolean getBreakOnFirstError() {
            return breakOnFirstError;
        }

        public void setBreakOnFirstError(Boolean breakOnFirstError) {
            this.breakOnFirstError = breakOnFirstError;
        }

        public String getBrokers() {
            return brokers;
        }

        public void setBrokers(String brokers) {
            this.brokers = brokers;
        }

        public String getCompressionCodec() {
            return compressionCodec;
        }

        public void setCompressionCodec(String compressionCodec) {
            this.compressionCodec = compressionCodec;
        }

        public Integer getRetryBackoffMs() {
            return retryBackoffMs;
        }

        public void setRetryBackoffMs(Integer retryBackoffMs) {
            this.retryBackoffMs = retryBackoffMs;
        }

        public Integer getSendBufferBytes() {
            return sendBufferBytes;
        }

        public void setSendBufferBytes(Integer sendBufferBytes) {
            this.sendBufferBytes = sendBufferBytes;
        }

        public Integer getRequestTimeoutMs() {
            return requestTimeoutMs;
        }

        public void setRequestTimeoutMs(Integer requestTimeoutMs) {
            this.requestTimeoutMs = requestTimeoutMs;
        }

        public Integer getQueueBufferingMaxMessages() {
            return queueBufferingMaxMessages;
        }

        public void setQueueBufferingMaxMessages(
                Integer queueBufferingMaxMessages) {
            this.queueBufferingMaxMessages = queueBufferingMaxMessages;
        }

        public String getSerializerClass() {
            return serializerClass;
        }

        public void setSerializerClass(String serializerClass) {
            this.serializerClass = serializerClass;
        }

        public String getKeySerializerClass() {
            return keySerializerClass;
        }

        public void setKeySerializerClass(String keySerializerClass) {
            this.keySerializerClass = keySerializerClass;
        }

        public String getKerberosInitCmd() {
            return kerberosInitCmd;
        }

        public void setKerberosInitCmd(String kerberosInitCmd) {
            this.kerberosInitCmd = kerberosInitCmd;
        }

        public Integer getKerberosBeforeReloginMinTime() {
            return kerberosBeforeReloginMinTime;
        }

        public void setKerberosBeforeReloginMinTime(
                Integer kerberosBeforeReloginMinTime) {
            this.kerberosBeforeReloginMinTime = kerberosBeforeReloginMinTime;
        }

        public Double getKerberosRenewJitter() {
            return kerberosRenewJitter;
        }

        public void setKerberosRenewJitter(Double kerberosRenewJitter) {
            this.kerberosRenewJitter = kerberosRenewJitter;
        }

        public Double getKerberosRenewWindowFactor() {
            return kerberosRenewWindowFactor;
        }

        public void setKerberosRenewWindowFactor(
                Double kerberosRenewWindowFactor) {
            this.kerberosRenewWindowFactor = kerberosRenewWindowFactor;
        }

        public String getKerberosPrincipalToLocalRules() {
            return kerberosPrincipalToLocalRules;
        }

        public void setKerberosPrincipalToLocalRules(
                String kerberosPrincipalToLocalRules) {
            this.kerberosPrincipalToLocalRules = kerberosPrincipalToLocalRules;
        }

        public String getSslCipherSuites() {
            return sslCipherSuites;
        }

        public void setSslCipherSuites(String sslCipherSuites) {
            this.sslCipherSuites = sslCipherSuites;
        }

        public String getSslEndpointAlgorithm() {
            return sslEndpointAlgorithm;
        }

        public void setSslEndpointAlgorithm(String sslEndpointAlgorithm) {
            this.sslEndpointAlgorithm = sslEndpointAlgorithm;
        }

        public String getSslKeymanagerAlgorithm() {
            return sslKeymanagerAlgorithm;
        }

        public void setSslKeymanagerAlgorithm(String sslKeymanagerAlgorithm) {
            this.sslKeymanagerAlgorithm = sslKeymanagerAlgorithm;
        }

        public String getSslTrustmanagerAlgorithm() {
            return sslTrustmanagerAlgorithm;
        }

        public void setSslTrustmanagerAlgorithm(String sslTrustmanagerAlgorithm) {
            this.sslTrustmanagerAlgorithm = sslTrustmanagerAlgorithm;
        }

        public String getSslEnabledProtocols() {
            return sslEnabledProtocols;
        }

        public void setSslEnabledProtocols(String sslEnabledProtocols) {
            this.sslEnabledProtocols = sslEnabledProtocols;
        }

        public String getSslKeystoreType() {
            return sslKeystoreType;
        }

        public void setSslKeystoreType(String sslKeystoreType) {
            this.sslKeystoreType = sslKeystoreType;
        }

        public String getSslProtocol() {
            return sslProtocol;
        }

        public void setSslProtocol(String sslProtocol) {
            this.sslProtocol = sslProtocol;
        }

        public String getSslProvider() {
            return sslProvider;
        }

        public void setSslProvider(String sslProvider) {
            this.sslProvider = sslProvider;
        }

        public String getSslTruststoreType() {
            return sslTruststoreType;
        }

        public void setSslTruststoreType(String sslTruststoreType) {
            this.sslTruststoreType = sslTruststoreType;
        }

        public String getSaslKerberosServiceName() {
            return saslKerberosServiceName;
        }

        public void setSaslKerberosServiceName(String saslKerberosServiceName) {
            this.saslKerberosServiceName = saslKerberosServiceName;
        }

        public String getSaslMechanism() {
            return saslMechanism;
        }

        public void setSaslMechanism(String saslMechanism) {
            this.saslMechanism = saslMechanism;
        }

        public String getSaslJaasConfig() {
            return saslJaasConfig;
        }

        public void setSaslJaasConfig(String saslJaasConfig) {
            this.saslJaasConfig = saslJaasConfig;
        }

        public String getSecurityProtocol() {
            return securityProtocol;
        }

        public void setSecurityProtocol(String securityProtocol) {
            this.securityProtocol = securityProtocol;
        }

        public SSLContextParameters getSslContextParameters() {
            return sslContextParameters;
        }

        public void setSslContextParameters(
                SSLContextParameters sslContextParameters) {
            this.sslContextParameters = sslContextParameters;
        }

        public String getSslKeyPassword() {
            return sslKeyPassword;
        }

        public void setSslKeyPassword(String sslKeyPassword) {
            this.sslKeyPassword = sslKeyPassword;
        }

        public String getSslKeystoreLocation() {
            return sslKeystoreLocation;
        }

        public void setSslKeystoreLocation(String sslKeystoreLocation) {
            this.sslKeystoreLocation = sslKeystoreLocation;
        }

        public String getSslKeystorePassword() {
            return sslKeystorePassword;
        }

        public void setSslKeystorePassword(String sslKeystorePassword) {
            this.sslKeystorePassword = sslKeystorePassword;
        }

        public String getSslTruststoreLocation() {
            return sslTruststoreLocation;
        }

        public void setSslTruststoreLocation(String sslTruststoreLocation) {
            this.sslTruststoreLocation = sslTruststoreLocation;
        }

        public String getSslTruststorePassword() {
            return sslTruststorePassword;
        }

        public void setSslTruststorePassword(String sslTruststorePassword) {
            this.sslTruststorePassword = sslTruststorePassword;
        }

        public Integer getBufferMemorySize() {
            return bufferMemorySize;
        }

        public void setBufferMemorySize(Integer bufferMemorySize) {
            this.bufferMemorySize = bufferMemorySize;
        }

        public String getKey() {
            return key;
        }

        public void setKey(String key) {
            this.key = key;
        }

        public Integer getPartitionKey() {
            return partitionKey;
        }

        public void setPartitionKey(Integer partitionKey) {
            this.partitionKey = partitionKey;
        }

        public String getRequestRequiredAcks() {
            return requestRequiredAcks;
        }

        public void setRequestRequiredAcks(String requestRequiredAcks) {
            this.requestRequiredAcks = requestRequiredAcks;
        }

        public Integer getRetries() {
            return retries;
        }

        public void setRetries(Integer retries) {
            this.retries = retries;
        }

        public Integer getProducerBatchSize() {
            return producerBatchSize;
        }

        public void setProducerBatchSize(Integer producerBatchSize) {
            this.producerBatchSize = producerBatchSize;
        }

        public Integer getConnectionMaxIdleMs() {
            return connectionMaxIdleMs;
        }

        public void setConnectionMaxIdleMs(Integer connectionMaxIdleMs) {
            this.connectionMaxIdleMs = connectionMaxIdleMs;
        }

        public Integer getLingerMs() {
            return lingerMs;
        }

        public void setLingerMs(Integer lingerMs) {
            this.lingerMs = lingerMs;
        }

        public Integer getMaxBlockMs() {
            return maxBlockMs;
        }

        public void setMaxBlockMs(Integer maxBlockMs) {
            this.maxBlockMs = maxBlockMs;
        }

        public Integer getMaxRequestSize() {
            return maxRequestSize;
        }

        public void setMaxRequestSize(Integer maxRequestSize) {
            this.maxRequestSize = maxRequestSize;
        }

        public Integer getReceiveBufferBytes() {
            return receiveBufferBytes;
        }

        public void setReceiveBufferBytes(Integer receiveBufferBytes) {
            this.receiveBufferBytes = receiveBufferBytes;
        }

        public Integer getMaxInFlightRequest() {
            return maxInFlightRequest;
        }

        public void setMaxInFlightRequest(Integer maxInFlightRequest) {
            this.maxInFlightRequest = maxInFlightRequest;
        }

        public Integer getMetadataMaxAgeMs() {
            return metadataMaxAgeMs;
        }

        public void setMetadataMaxAgeMs(Integer metadataMaxAgeMs) {
            this.metadataMaxAgeMs = metadataMaxAgeMs;
        }

        public String getMetricReporters() {
            return metricReporters;
        }

        public void setMetricReporters(String metricReporters) {
            this.metricReporters = metricReporters;
        }

        public Integer getNoOfMetricsSample() {
            return noOfMetricsSample;
        }

        public void setNoOfMetricsSample(Integer noOfMetricsSample) {
            this.noOfMetricsSample = noOfMetricsSample;
        }

        public Integer getMetricsSampleWindowMs() {
            return metricsSampleWindowMs;
        }

        public void setMetricsSampleWindowMs(Integer metricsSampleWindowMs) {
            this.metricsSampleWindowMs = metricsSampleWindowMs;
        }

        public Integer getReconnectBackoffMs() {
            return reconnectBackoffMs;
        }

        public void setReconnectBackoffMs(Integer reconnectBackoffMs) {
            this.reconnectBackoffMs = reconnectBackoffMs;
        }

        public Integer getHeartbeatIntervalMs() {
            return heartbeatIntervalMs;
        }

        public void setHeartbeatIntervalMs(Integer heartbeatIntervalMs) {
            this.heartbeatIntervalMs = heartbeatIntervalMs;
        }

        public Integer getMaxPartitionFetchBytes() {
            return maxPartitionFetchBytes;
        }

        public void setMaxPartitionFetchBytes(Integer maxPartitionFetchBytes) {
            this.maxPartitionFetchBytes = maxPartitionFetchBytes;
        }

        public Integer getSessionTimeoutMs() {
            return sessionTimeoutMs;
        }

        public void setSessionTimeoutMs(Integer sessionTimeoutMs) {
            this.sessionTimeoutMs = sessionTimeoutMs;
        }

        public Integer getMaxPollRecords() {
            return maxPollRecords;
        }

        public void setMaxPollRecords(Integer maxPollRecords) {
            this.maxPollRecords = maxPollRecords;
        }

        public Long getPollTimeoutMs() {
            return pollTimeoutMs;
        }

        public void setPollTimeoutMs(Long pollTimeoutMs) {
            this.pollTimeoutMs = pollTimeoutMs;
        }

        public Long getMaxPollIntervalMs() {
            return maxPollIntervalMs;
        }

        public void setMaxPollIntervalMs(Long maxPollIntervalMs) {
            this.maxPollIntervalMs = maxPollIntervalMs;
        }

        public String getPartitionAssignor() {
            return partitionAssignor;
        }

        public void setPartitionAssignor(String partitionAssignor) {
            this.partitionAssignor = partitionAssignor;
        }

        public Integer getConsumerRequestTimeoutMs() {
            return consumerRequestTimeoutMs;
        }

        public void setConsumerRequestTimeoutMs(Integer consumerRequestTimeoutMs) {
            this.consumerRequestTimeoutMs = consumerRequestTimeoutMs;
        }

        public Boolean getCheckCrcs() {
            return checkCrcs;
        }

        public void setCheckCrcs(Boolean checkCrcs) {
            this.checkCrcs = checkCrcs;
        }

        public String getKeyDeserializer() {
            return keyDeserializer;
        }

        public void setKeyDeserializer(String keyDeserializer) {
            this.keyDeserializer = keyDeserializer;
        }

        public String getValueDeserializer() {
            return valueDeserializer;
        }

        public void setValueDeserializer(String valueDeserializer) {
            this.valueDeserializer = valueDeserializer;
        }

        public String getSeekTo() {
            return seekTo;
        }

        public void setSeekTo(String seekTo) {
            this.seekTo = seekTo;
        }

        public ExecutorService getWorkerPool() {
            return workerPool;
        }

        public void setWorkerPool(ExecutorService workerPool) {
            this.workerPool = workerPool;
        }

        public Integer getWorkerPoolCoreSize() {
            return workerPoolCoreSize;
        }

        public void setWorkerPoolCoreSize(Integer workerPoolCoreSize) {
            this.workerPoolCoreSize = workerPoolCoreSize;
        }

        public Integer getWorkerPoolMaxSize() {
            return workerPoolMaxSize;
        }

        public void setWorkerPoolMaxSize(Integer workerPoolMaxSize) {
            this.workerPoolMaxSize = workerPoolMaxSize;
        }

        public Boolean getRecordMetadata() {
            return recordMetadata;
        }

        public void setRecordMetadata(Boolean recordMetadata) {
            this.recordMetadata = recordMetadata;
        }

        public String getInterceptorClasses() {
            return interceptorClasses;
        }

        public void setInterceptorClasses(String interceptorClasses) {
            this.interceptorClasses = interceptorClasses;
        }

        public Boolean getEnableIdempotence() {
            return enableIdempotence;
        }

        public void setEnableIdempotence(Boolean enableIdempotence) {
            this.enableIdempotence = enableIdempotence;
        }

        public Integer getReconnectBackoffMaxMs() {
            return reconnectBackoffMaxMs;
        }

        public void setReconnectBackoffMaxMs(Integer reconnectBackoffMaxMs) {
            this.reconnectBackoffMaxMs = reconnectBackoffMaxMs;
        }

        public HeaderFilterStrategy getHeaderFilterStrategy() {
            return headerFilterStrategy;
        }

        public void setHeaderFilterStrategy(
                HeaderFilterStrategy headerFilterStrategy) {
            this.headerFilterStrategy = headerFilterStrategy;
        }
    }
}